<?php

namespace app\service\tool;

use yii\base\Model;

/**
 * 转换工具类
 * Class GenerateService
 * @package app\models
 */
class ConvertService extends Model
{

    /**
     * 判断是否为小数
     * @param $value
     * @return bool
     */
    public static function isDecimal($value)
    {

        return is_numeric($value) && strstr('.', $value);
    }

    /**
     * 小数四舍五入操作
     * @param float $floatNumber 小数
     * @param int $len 保留长度[默认：2]
     * @return float
     */
    public static function toFiveUpNumber($floatNumber = 0.000, $len = 2)
    {

        $floatNumber = round($floatNumber, $len);

        return $floatNumber;
    }

    /**
     * 小数进一操作
     * @param float $floatNumber 小数
     * @param int $len 保留长度[默认：2]
     * @return float|int
     */
    public static function toUpNumber($floatNumber = 0.000, $len = 2)
    {

        // 先来塑造 操作数
        $zero = 1;
        for ($i = 1; $i <= $len; $i++) {
            $zero .= 0;
        }
        $zero = intval($zero);

        $floatNumber = ceil($floatNumber * $zero) / $zero;

        return $floatNumber;
    }

    /**
     * 转换为布尔类型
     * @param $value
     * @return bool
     */
    public static function toBoolVal($value)
    {
        return is_numeric($value) ? boolval($value) : $value === 'true';
    }

    /**
     * 去除全部空格
     * @param $str
     * @return mixed|string
     */
    public static function clearAllSpace($str)
    {
        $search  = array(' ', '　', 'ㅤ', ' ', '	', '  ');
        $replace = '';
        $str     = str_replace($search, $replace, $str);
        $str     = trim($str);
        return $str;
    }

    /**
     * 执行：[xml]转为[array]
     * @param string $xml
     * @return mixed|string
     */
    public static function xmlToArray($xml = '')
    {

        if (!$xml) {
            return '';
        }

        //将XML转为array
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $values;
    }

    /**
     * 执行：数组转[xml]字符
     * @param array $params
     * @return string
     */
    public static function arrayToXml($params = [])
    {

        if (empty($params))

            return '';

        $xml = "<xml>";
        foreach ($params as $key => $val) {

            if (is_numeric($val)) {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
            }
        }

        $xml .= "</xml>";
        return $xml;
    }

    /**
     * 数量以文本展示
     * @param int $num
     * @return int|string
     */
    public static function toNumShort($num = 0)
    {

        // 先转为数字
        $num = intval($num);

        // 首先小于 1k 直接返回
        if ($num < 1000) {

            return $num;
        }

        // 数目 / 1000 大于等于 1，小于 9 就是 千单位
        $transit = intval($num / 1000);
        if ($transit >= 1 && $transit <= 9) {

            return $transit . '千+';
        }

        // 数目 / 10000 大于等于 1，小于 9999 就是 万单位
        $transit = intval($num / 10000);
        if ($transit >= 1 && $transit <= 9999) {

            return $transit . '万+';
        }

        // 数目 / 10000000 大于等于 1，小于 9999 就是 亿单位 -- 999999
        $transit = intval($num / 100000000);
        if ($transit >= 1 && $transit <= 99999) {

            return $transit . '亿+';
        }

        return '1兆+';
    }

    /**
     * base64 url 编码
     * @param $string
     * @return mixed|string
     */
    public static function base64UrlEncode($string)
    {

        $data = base64_encode($string);
        $data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);
        return $data;
    }

    /**
     * base64 url 解码
     * @param $string
     * @return mixed|string
     */
    public static function base64UrlDecode($string)
    {

        $data = str_replace(array('-', '_'), array('+', '/'), $string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {

            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    /**
     * 手机号加密中间四位数
     * @param $phone
     * @return mixed
     */
    public static function phoneEncode($phone)
    {

        $phone = substr_replace($phone, '****', 3, 4);
        return $phone;
    }

    /**
     * Ascii转拼音
     * @param $asc
     * @param $pyarr
     * @return string
     */
    public static function ascToPinyin($asc, &$pyarr)
    {
        if ($asc < 128) return chr($asc);
        elseif (isset($pyarr[$asc])) return $pyarr[$asc];
        else {
            foreach ($pyarr as $id => $p) {
                if ($id >= $asc) return $p;
            }
        }
        return null;
    }

    /**
     * gbk转拼音
     * @param string $txt 转换字符
     * @param bool $returnArray 是否返回数组
     * @param string $break 返回字符串的分隔符
     * @return array|string
     */
    public static function chineseToPinyin($txt, $returnArray = true, $break = '')
    {
        $txt      = iconv('UTF-8', 'GBK', $txt);
        $l        = strlen($txt);
        $i        = 0;
        $pyarr    = array();
        $py       = array();
        $filename = __DIR__ . '/../pinYinTable/gb-pinyin.table';
        $fp       = fopen($filename, 'r');
        while (!feof($fp)) {
            $p                    = explode("-", fgets($fp, 32));
            $pyarr[intval($p[1])] = trim($p[0]);
        }
        fclose($fp);
        ksort($pyarr);
        while ($i < $l) {
            $tmp = ord($txt[$i]);
            if ($tmp >= 128) {
                $asc = abs($tmp * 256 + ord($txt[$i + 1]) - 65536);
                $i   = $i + 1;
            } else $asc = $tmp;
            $py[] = self::ascToPinyin($asc, $pyarr);
            $i++;
        }
        // 返回字符
        if (!$returnArray) return implode($break, $py);
        return $py;
    }

    /**
     * 是否为[JSON]数据
     * @param $jsonStr
     * @return bool
     */
    public static function isJson($jsonStr)
    {
        // JSON为空
        if ($jsonStr == '[]') return true;
        // 费字符串直接返回否
        if (!is_string($jsonStr)) return false;
        $data = json_decode($jsonStr, true);
        if (!($data && is_object($data)) && !(is_array($data) && !empty($data))) return false;
        return true;
    }

    /**
     * 字符串替换
     * @param string $string 要替换的文本
     * @param array $replace 要替换的数据，格式: [要替换的键 => 要替换的内容]
     * @return mixed|string
     */
    public static function replaceStr($string = '', $replace = [])
    {

        if (!is_array($replace)) $replace = [$replace];
        foreach ($replace as $k => $v) {
            $string = str_replace($k, $v, $string);
        }

        return $string;
    }

    /**
     * 小数点补0
     * @param string|int|float $number 需要不全的数
     * @param int $zeroLen 补全小数长度
     * @return string
     */
    public static function decimalFillUpZero($number, $zeroLen = 2) {

        return sprintf("%01.{$zeroLen}f", $number);
    }

    /**
     * 数组转换为路径
     * @param $array
     * @return array|string|string[]
     */
    public static function arrayToPath($array) {
        $array = array_filter($array);
        $array = implode('/', $array);
        $array = str_replace('//', '/', $array);
        $array = str_replace('\\', '/', $array);
        return $array;
    }
}
